package ejb;

import java.util.List;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import utils.ZaraException;

import entidadesBD.Articulo;
import entidadesBD.ArticulosPALC;
import entidadesBD.ArticulosSolDist;
import entidadesBD.CentroDistribucion;
import entidadesBD.SolDist;
import entidadesBD.Tienda;
import entidadesVO.ArticulosSolDistVO;
import entidadesVO.CentroDistribucionVO;
import entidadesVO.SolDistVO;


public @Stateless class AdministradorSolDistBean implements AdministradorSolDist {
	
	@PersistenceContext(unitName="zara")
	private EntityManager manager;
	
	@SuppressWarnings("finally")
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public SolDistVO getSolDist(String nombreCentroDistribucion) throws ZaraException{
		
		java.sql.Date date = new java.sql.Date((new java.util.Date()).getTime());
		
		Query query = manager.createQuery("SELECT c FROM CentroDistribucion c WHERE c.nombreCentroDistribucion LIKE :nombreCentroDistribucion");
		query.setParameter("nombreCentroDistribucion", nombreCentroDistribucion);
		
		CentroDistribucionVO centroDistribucion = null; 
		
		try{
			centroDistribucion = ((CentroDistribucion)query.getSingleResult()).getCentroDistribucionVO();
		}catch (NonUniqueResultException e){
			throw new ZaraException(e.toString());
		}finally{
			if (centroDistribucion == null){
				
				throw new ZaraException("No existe un Centro de Distribucion para el nombre: " + nombreCentroDistribucion);
			}else{
			
				SolDistVO solDist = new SolDistVO(date, centroDistribucion);
				
				List articulosPALCList = null;
				
				try{
					articulosPALCList = manager.createQuery("SELECT ap FROM ArticulosPALC ap WHERE ap.procesado LIKE 0").getResultList();
				}catch (Exception e){
					throw new ZaraException(e.toString());
				}finally{
					if (articulosPALCList.size() == 0){
						throw new ZaraException("No hay Pedidos de Tienda(PALCS) guardados en la base de datos, por lo que no se puede generar la Solicitud de Distribucion");
					}
					for (int i = 0; i < articulosPALCList.size(); i++){
						ArticulosPALC articuloPALC = (ArticulosPALC)articulosPALCList.get(i);
						
						if (articuloPALC.getCentroDistribucion().getNombreCentroDistribucion().equals(centroDistribucion.getNombreCentroDistribucion())){
							ArticulosSolDistVO articulosSolDist = new ArticulosSolDistVO(articuloPALC.getArticulo().getArticuloVO(), articuloPALC.getCantidad(), articuloPALC.getPalc().getTienda().getTiendaVO());
							
							solDist.addArticulosSolDist(articulosSolDist);
						}
					}
					
					if (solDist.getArticulosSolDist().size() == 0){
						throw new ZaraException("No hay Pedidos de Tienda(PALCS) para el centro de distribucion seleccionado: " + centroDistribucion.getNombreCentroDistribucion());
					}else{
						return solDist;
					}
				}
			}
		}
	}
	
	public void persistirSolDist(SolDistVO solDistVO) throws ZaraException{
	
		try{
			Query queryCentroDistribucion = manager.createQuery("SELECT c FROM CentroDistribucion c WHERE c.nombreCentroDistribucion LIKE :nombreCentroDistribucion");
			queryCentroDistribucion.setParameter("nombreCentroDistribucion", solDistVO.getCentroDistribucion().getNombreCentroDistribucion());
			
			CentroDistribucion centroDistribucion = (CentroDistribucion)queryCentroDistribucion.getSingleResult();
			
			SolDist solDist = new SolDist(solDistVO.getFechaSolDist(), centroDistribucion);
			
			Object[] articulosSolDistList = solDistVO.getArticulosSolDist().toArray();
			
			for (int i = 0; i < articulosSolDistList.length; i++){
				
				Query queryTienda = manager.createQuery("SELECT t FROM Tienda t WHERE t.nombreTienda LIKE :nombreTienda");
				queryTienda.setParameter("nombreTienda", ((ArticulosSolDistVO)articulosSolDistList[i]).getTienda().getNombreTienda());
			
				Tienda tienda = (Tienda)queryTienda.getSingleResult();
				
				Query queryArticulo = manager.createQuery("SELECT a FROM Articulo a WHERE a.referencia LIKE :referencia");
				queryArticulo.setParameter("referencia", ((ArticulosSolDistVO)articulosSolDistList[i]).getArticulo().getReferencia());
			
				Articulo articulo = (Articulo)queryArticulo.getSingleResult();
				
				List articulosPALCList = null;
				
				try{
					articulosPALCList = manager.createQuery("SELECT ap FROM ArticulosPALC ap WHERE ap.procesado LIKE 0").getResultList();
				}catch (Exception e){
					throw new ZaraException(e.toString());
				}finally{
					
					boolean bool = true;
					
					for (int j = 0; j < articulosPALCList.size(); j++){
						
						ArticulosPALC articuloPALC = (ArticulosPALC)articulosPALCList.get(j);
						
						if((articuloPALC.getArticulo().equals(articulo))&&(articuloPALC.getCentroDistribucion().equals(centroDistribucion))&&(articuloPALC.getPalc().getTienda().equals(tienda))){
							
							articuloPALC.setProcesado(1);
							
							ArticulosSolDist articulosSolDist = new ArticulosSolDist(articuloPALC.getArticulo(), articuloPALC.getCantidad(), articuloPALC.getPalc().getTienda());
							articulosSolDist.setSolDist(solDist);
							
							solDist.addArticulosSolDist(articulosSolDist);
							
							bool = false;
							
							try{
								manager.merge(articuloPALC);
							}catch (Exception e1){
								throw new ZaraException("No se pudo modificar un Articulo PALC " +  e1.toString());
							}	
						}
					}
					
					if (bool){
						throw new ZaraException("El pedido para el articulo: " + articulo.getReferencia() + " ya fue procesado, por favor vuelva a generar la Solicitud de Distribucion");
					}
				}
			}
			
			manager.merge(solDist);
		
		}catch (Exception e){
			throw new ZaraException("No se pudo grabar la Solicitud de Distribucion " + e.toString());
		}
	}
}
